/*
 * 测试封装(Calendar) 
 */

// 定义对象
function Calendar(year,month,date){

    // 定义属性(通过构造函数的参数来初始化这些属性)
    this.year = year ;
    this.month = month ;
    this.date = date ;

    // 采用函数局部变量来表示私有变量
    const SIGNS = ['鼠','牛','虎','兔','龙','蛇','马','羊','猴','鸡','狗','猪'] ;
    const REFERENCE_YEAR = 2020 ; // 以2020年为参照点，因为这一年是鼠年

    // 注意: 判断闰年的函数不需要接受任何参数即可完成判断，因为年份存储在当前的实例中
    this.isLeapYear = function(){
        if( this.year % 4 == 0 && this.year % 100 != 0){
            return true ;
        }
        if( this.year % 400 == 0 ){
            return true ;
        }
        return false ;
    }

    this.sign = function(){
        // 用当前实例中的年份减去参照年份
        let x = this.year - REFERENCE_YEAR ; // 求年份之间的差值
        let i = x % SIGNS.length ; // 求余数(可能是大于12的也可能是12以内的，还有可能是负数)
        i = i >= 0 ? i : SIGNS.length + i ; // 若为非负数则取本身，否则取 SIGNS.length + i
        let s = SIGNS[ i ] ; // 根据下标获取相应的生肖
        return s ;
    }

    this.dayOfYear = function(){
        let days = 0 ;
        for( let i = 1 ; i < month ; i++ ){
            switch( i ) {
                case 2:
                    days += ( this.isLeapYear() ? 29 : 28 );
                    break ; // 注意 switch 语句中的 break 默认仅退出 switch 语句
                case 4 : 
                case 6 : 
                case 9 : 
                case 11 :
                    days += 30 ;
                    break ;
                case 1 : 
                case 3 :
                case 5 :
                case 7 :
                case 8 :
                case 10 :
                case 12:
                    days += 31 ;
                    break ;
            }
        }
        days += date ;
        return days ;
    }
}

let c = new Calendar(2021, 9, 8);
console.log( c );

let leap = c.isLeapYear();
console.log( leap );

let sign = c.sign();
console.log( sign );

let days = c.dayOfYear();
console.log( days );